package cn.lut.springboot.factory;

import cn.lut.springboot.api.EmployeeRemoteService;
import cn.lut.springboot.entity.Employee;
import cn.lut.springboot.util.ResultEntity;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 *1.实现consumer端服务降级功能
 * 2.实现FallbackFactory接口时要传入@FeignClient注解标记的接口类型
 * 3.在create（）方法中返回@FeignClient注解标记的接口类型的对象，当Provider调用失败后，会执行这个对象的对应方法
 * @user:dell
 * @date:2021年01月06 15:41
 */
// 请注意自动扫描包的规则
// 比如：feign-consumer 工程需要使用 MyFallBackFactory，那么 MyFallBackFactory 应该在 feign-consumer 工程的主启动类所在包或它的子包下
// 简单来说：哪个工程用这个类，哪个工程必须想办法扫描到这个类
@Component
public class MyFallBackFactory implements FallbackFactory<EmployeeRemoteService> {
    // cause 对象是失败原因对应的异常对象
    @Override
    public EmployeeRemoteService create(Throwable throwable) {
        return new EmployeeRemoteService() {
            @Override
            public Employee getEmployeeRemote() {
                return null;
            }

            @Override
            public List<Employee> getEmpListRemote(String keyword) {

                return null;
            }

            @Override
            public ResultEntity<Employee> getEmpWithCircuitBreaker(String signal) {
                return ResultEntity.failed(throwable.getMessage());
            }
        };
    }

}
